#pragma once

#include <atomic>
#include <memory>
#include "base_noncopyable.h"
#include "common_media_define.h"
#include "media_frame.h"
#include "base_callback_list.h"
#include "media_snap.h"

namespace El {
namespace Media {

class SnapManager : public ISnap {
    DISALLOW_COPY_AND_MOVE(SnapManager);

public:
    SnapManager(uint32_t ch, int32_t type);
    virtual ~SnapManager() = default;

    /**
     * @brief 启动抓图模块
     * @return true 成功，false 失败
     */
    bool Start() override;

    /**
     * @brief 关闭抓图模块
     */
    void Stop() override;

    /**
     * @brief 注册抓图回调
     * @param proc 回调函数
     * @return 返回handle，用于注销
     */
    int32_t Register(const Proc &proc) override;

    /**
     * @brief 注销抓图回调
     * @param handle 回调句柄
     */
    void Unregister(int32_t handle) override;

    /**
     * @brief 手动抓图
     * @param ch 通道号
     * @return true 成功，false 失败
     */
    bool ManualSnap() override;

private:
    void OnSnap(MediaFramePtr &media);

private:
    uint32_t ch_{0};
    int32_t type_{0};
    int32_t handle_{-1};
    bool isStarted_{false};

    Base::CallbackList<void, const MediaFramePtr &> callbackManager_;
};

} // namespace Media
} // namespace El